#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<long long> nums, powers;
// dp[i]描述被删除的数不超过nums[i]的删除数最大值
vector<long long> dp;

long long max(long long a, long long b) {
    return a > b ? a : b;
}

int main() {
    int times; cin >> times;
    vector<long long> arr;
    for (int i = 0; i < times; i++) {
        long long curr; cin >> curr;
        arr.push_back(curr);
    }
    sort(arr.begin(), arr.end());
    // 每个数字有自己的“位权”，nums储存数，powers储存(数*数的数量)的值
    long long pre = arr[0]; long long currPower = 0;
    nums.push_back(pre); powers.push_back(0);
    for (int i = 0; i < times; i++) {
        if (arr[i] == pre) { powers.back() += pre; }
        else {
            pre = arr[i];
            nums.push_back(pre);
            powers.push_back(pre);
        }
    }
    // 初始化带有位权的数组
    dp.resize(nums.size(), 0);
    for (int i = 0; i < nums.size(); i++) {
        if (i == 0) { dp[i] = powers[i]; continue; }
        if (nums[i] - nums[i - 1] == 1) {
            if (i == 1) { dp[i] = max(powers[i], dp[0]); }
            else {
                dp[i] = max(dp[i - 2] + powers[i], dp[i - 1]);
            }
            // 要么删除自己，不考虑前一个比它小1的数
            // 要么删除前一个比它小1的数，不考虑自己
            // 问题是有重叠性的，永远选那个最大的情况就行
        }
        else {
            dp[i] = dp[i - 1] + powers[i];
        }
    }
    // 动态规划计算
    cout << dp.back();
    return 0;
}